package cn.bblocks.cacheTest.configuration;

import java.util.concurrent.ThreadPoolExecutor;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

/**
* @Description:TODO
* @author 作者:Administrator
* @createDate 创建时间：2019年11月17日 下午10:38:24
* @version 1.0     
*/
@Configuration
@EnableAsync
public class AsyncConfig {
//    @Bean
//    public AsyncTaskExecutor asyncTaskExecutor() {
//    
//        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//        //线程池名的前缀：设置好了之后可以方便我们定位处理任务所在的线程池
//        executor.setThreadNamePrefix("courses-schedule-");
//        //最大线程数10：线程池最大的线程数，只有在缓冲队列满了之后才会申请超过核心线程数的线程
//        executor.setMaxPoolSize(10);
//        //核心线程数3：线程池创建时候初始化的线程数
//        executor.setCorePoolSize(5);
//        //缓冲队列0：用来缓冲执行任务的队列
//        executor.setQueueCapacity(5);
//        //允许线程的空闲时间60秒：当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
//        executor.setKeepAliveSeconds(60);
//        // 当线程池已满,且等待队列也满了的时候,直接抛弃当前线程(不会抛出异常)
////        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
//        executor.initialize();
//        return executor;
//    }
	
	
	 @Bean
	    public TaskExecutor taskExecutor() {
	        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
	        // 设置核心线程数
	        executor.setCorePoolSize(5);
	        // 设置最大线程数
	        executor.setMaxPoolSize(20);
	        // 设置队列容量
	        executor.setQueueCapacity(20);
	        // 设置线程活跃时间（秒）
	        executor.setKeepAliveSeconds(60);
	        // 设置默认线程名称
	        executor.setThreadNamePrefix("hello-");
	        // 设置拒绝策略
	        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
	        // 等待所有任务结束后再关闭线程池
	        executor.setWaitForTasksToCompleteOnShutdown(true);
	        return executor;
	    }
}